{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Administering your GIS\n",
    "\n",
    "ArcGIS administrators can leverage the `gis.admin` module of **ArcGIS API for Python** to assist with and automate their administrative tasks. These tasks can include anything from checking the status of servers, assigning licenses to named user accounts, or modifying the GIS's look and feel.\n",
    "\n",
    "ArcGIS Online Organizations (AGOL) and ArcGIS Enterprise instances vary in the amount of customization you can make. Enterprise organizations can be customized much more than ArcGIS Online organizations as Enterprise allows administrators full access. No matter what your Organization is, the API and usage are identical. The table below illustrates the extent to which each can be customized and administered."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h3>Organizational differences</h3>\n",
    "\n",
    "<table border=\"1\" class=\"dataframe\"><thead><tr style=\"text-align: right;\"><th>Function</th><th>ArcGIS Online</th><th>ArcGIS Enterprise</th></tr></thead><tbody><tr><td>collaborations</td><td>X</td><td>X</td></tr><tr><td>credits</td><td>X</td><td></td></tr><tr><td>federation</td><td></td><td>X</td></tr><tr><td>license</td><td>X</td><td>X</td></tr><tr><td>logs</td><td></td><td>X</td></tr><tr><td>machines</td><td></td><td>X</td></tr><tr><td>metadata</td><td>X</td><td>X</td></tr><tr><td>password_policy</td><td>X</td><td>X</td></tr><tr><td>security</td><td></td><td>X</td></tr><tr><td>server</td><td></td><td>X</td></tr><tr><td>site</td><td></td><td>X</td></tr><tr><td>system</td><td></td><td>X</td></tr><tr><td>ux</td><td>X</td><td>X</td></tr></tbody></table>\n",
    "\n",
    "Most properties on ArcGIS Online are available on ArcGIS Enterprise, with the exception of **credit reporting** since ArcGIS Enterprise does not consume credits.\n",
    "\n",
    "<blockquote><b>Note:</b> You need to log in using a named user account with administrator privileges. The API automatically detects your role; if you are an organizational administrator, the <b>GIS</b> object will grant you access to the <b>admin</b> module.\n",
    "</blockquote>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Table of Contents**\n",
    " - [Managing named user licenses and entitlements](#Managing-named-user-licenses-and-entitlements)\n",
    "  - [Listing apps licensed through the organization](#Listing-apps-licensed-through-the-organization)\n",
    "  - [Getting available licenses for an app](#Getting-available-licenses-for-an-app)\n",
    "  - [Querying extensions assigned to a named user account](#Querying-extensions-assigned-to-a-named-user-account)\n",
    "  - [Assigning licenses and entitlements to a named user account](#Assigning-licenses-and-entitlements-to-a-named-user-account)\n",
    "  - [Revoking licenses from a named user account](#Revoking-licenses-from-a-named-used-account)\n",
    " - [Managing ArcGIS Online credits](#Managing-ArcGIS-Online-credits)\n",
    "  - [Viewing available credits](#Viewing-available-credits:)\n",
    "  - [Managing credits through credit budgeting](#Managing-credits-through-credit-budgeting)\n",
    "   - [Allocating credits to a user](#Allocating-credits-to-a-user)\n",
    "   - [Checking credits assigned and available to a user](#Checking-credits-assigned-and-available-to-a-user)\n",
    " - [Attaching and removing servers from your GIS](#Attaching-and-removing-ArcGIS-Servers-from-your-GIS)\n",
    "  - [Validating your servers](#Validating-your-servers)\n",
    "  - [Unfederating a server](#Unfederating-a-server)\n",
    " - [Querying Portal logs](#Querying-Portal-logs)\n",
    "  - [Filtering and querying Portal logs](#Filtering-and-querying-Portal-logs)\n",
    "  - [Clearing logs](#Clearing-logs)\n",
    " - [Managing GIS security](#Managing-GIS-security)\n",
    "  - [Working with password policies](#Working-with-password-policies)\n",
    "    - [Inspecting password policy](#Inspecting-password-policy)\n",
    "    - [Updating password policy](#Updating-password-policy)\n",
    "    - [Resetting password policy](#Resetting-password-policy)\n",
    "  - [Working with security configurations](#Working-with-security-configurations)\n",
    "    - [Working with certificates](#SSL-certificates)\n",
    "    - [Enterprise identity store](#Enterprise-identity-store)\n",
    " - [Managing Enterprise licenses and system settings](#Managing-Enterprise-licenses-and-system-settings)\n",
    "  - [Inspecting licenses for Portal for ArcGIS](#Inspecting-licenses-for-Portal-for-ArcGIS)\n",
    "  - [Releasing ArcGIS Pro licenses checked out for offline use](#Releasing-ArcGIS-Pro-licenses-checked-out-for-offline-use)\n",
    "  - [Inspecting the machines powering your Portal for ArcGIS](#Inspecting-the-machines-powering-your-Portal-for-ArcGIS)\n",
    "  - [Inspecting system directories](#Inspecting-system-directories)\n",
    "  - [Inspecting web adaptors](#Inspecting-web-adaptors)\n",
    "  - [Inspecting other system properties](#Inspecting-other-system-properties)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "from arcgis.gis import GIS\n",
    "gis = GIS(profile=<your_online_admin_profile> or profile=<your_enterprise_admin_profile>)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Managing named user licenses and entitlements\n",
    "\n",
    "ArcGIS Online and Enterprise support assigning licenses for Esri premium apps such as ArcGIS Pro, Navigator for ArcGIS, AppStudio for ArcGIS Standard, Drone2Map for ArcGIS, ArcGIS Business Analyst web app, ArcGIS Community Analyst, GeoPlanner for ArcGIS, and other apps sold through ArcGIS Marketplace that use a per-member license type.\n",
    "\n",
    "As an administrator, use the `gis.admin.license` class of the Python API to view, manage, and specify which members have licenses for these apps. To learn more about the named user licensing model, visit the [manage licenses help](http://doc.arcgis.com/en/arcgis-online/administer/manage-licenses.htm) documentation."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Listing apps licensed through the organization\n",
    "To list all the apps currently licensed through your organization, use the `all()` method:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<ArcGIS Survey123 License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Insights License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <Esri Redistricting License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Pro License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Drone2Map License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS GeoPlanner License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Drone2Map License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Workforce License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Community Analyst License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <Runtime Analysis  License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Navigator License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Collector License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Location Sharing License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS Business Analyst Web and Mobile Apps License @ https://dummy.arcgis.com/sharing/rest/ >,\n",
       " <ArcGIS CityEngine License @ https://dummy.arcgis.com/sharing/rest/ >]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.license.all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can get the license for a particular app using the `get()` method:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<ArcGIS Pro License @ https://dummy.arcgis.com/sharing/rest/ >"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license = gis.admin.license.get('ArcGIS Pro')\n",
    "pro_license"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "arcgis.gis.admin._license.License"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(pro_license)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Getting available licenses for an app\n",
    "To query the list of all users licensed for an app, call the `all()` method from the `License` object corresponding to that app:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'username': 'test_user_1',\n",
       "  'lastLogin': 1713440160000,\n",
       "  'disconnected': False,\n",
       "  'entitlements': ['businessStdN',\n",
       "   'desktopAdvN',\n",
       "   'smpAsiaPacificN',\n",
       "   'smpEuropeN',\n",
       "   'smpLAmericaN',\n",
       "   'smpMidEAfricaN',\n",
       "   'smpNAmericaN']},\n",
       " {'username': 'test_user_2',\n",
       "  'lastLogin': 1753345606000,\n",
       "  'disconnected': False,\n",
       "  'entitlements': ['3DAnalystN',\n",
       "   'bathymetryN',\n",
       "   'businessStdN',\n",
       "   'dataInteropN',\n",
       "   'dataReviewerN',\n",
       "   'desktopAdvN',\n",
       "   'geostatAnalystN',\n",
       "   'imageAnalystN',\n",
       "   'networkAnalystN',\n",
       "   'publisherN',\n",
       "   'spatialAnalystN']},\n",
       " {'username': 'test_user_3',\n",
       "  'lastLogin': 1741905638000,\n",
       "  'disconnected': False,\n",
       "  'entitlements': ['desktopAdvN', 'networkAnalystN']},\n",
       " {'username': 'test_user_4',\n",
       "  'lastLogin': 1760452902000,\n",
       "  'disconnected': False,\n",
       "  'entitlements': ['3DAnalystN', 'aviationN', 'businessStdN', 'desktopStdN']},\n",
       " {'username': 'test_user_5',\n",
       "  'lastLogin': -1,\n",
       "  'disconnected': False,\n",
       "  'entitlements': ['workflowMgrN']},\n",
       " {'username': 'test_user_6',\n",
       "  'lastLogin': -1,\n",
       "  'disconnected': False,\n",
       "  'entitlements': ['3DAnalystN',\n",
       "   'businessStdN',\n",
       "   'dataReviewerN',\n",
       "   'desktopAdvN',\n",
       "   'geostatAnalystN',\n",
       "   'imageAnalystN',\n",
       "   'networkAnalystN',\n",
       "   'smpAsiaPacificN',\n",
       "   'smpEuropeN',\n",
       "   'smpMidEAfricaN',\n",
       "   'smpNAmericaN',\n",
       "   'spatialAnalystN',\n",
       "   'workflowMgrN']},\n",
       " {'username': 'test_user_7',\n",
       "  'lastLogin': -1,\n",
       "  'disconnected': False,\n",
       "  'entitlements': ['desktopAdvN']}]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#get all users licensed for ArcGIS Pro\n",
    "pro_license.all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using the `plot()` method of the `License` object, you can quickly pull up a bar chart showing the number of assigned and remaining licenses for each extension of the app."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x903743dd68>"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAFVCAYAAADhWiRzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXfYFNXVwH8HREHAgiIxooIGRGygYMCuaNRo7LHEKBiN\nGk0sqWo0ojGWqLGbRKPYUSTGEishKooFaQoKBoKoYEONWD41Auf749yFeZd933dn5i7vMjm/59ln\nd2Z3zt69O3Pm3nNPEVXFcRzHKS6tWroBjuM4Tm1xRe84jlNwXNE7juMUHFf0juM4BccVveM4TsFx\nRe84jlNwXNE7juMUHFf0juM4BccVveM4TsFZoaUbALDmmmtqt27dWroZjuM4yxUTJkx4X1U7N/e5\nulD03bp1Y/z48S3dDMdxnOUKEXm9ms+56cZxHKfguKJ3HMcpOK7oHcdxCk5d2Ogdx1m++eqrr5gz\nZw5ffPFFSzelkLRt25auXbvSpk2bTMe7onccJzdz5syhY8eOdOvWDRFp6eYUClXlgw8+YM6cOXTv\n3j2TjGZNNyJyo4i8JyJTE/s6icgoEZkRnldPvHe6iMwUkVdFZPdMrXIcZ7niiy++YI011nAlXwNE\nhDXWWCPXbKkaG/1NwB5l+04DRqtqD2B02EZEegOHApuEY64VkdaZW+c4znKDK/nakbdvm1X0qjoG\n+LBs977AzeH1zcB+if13quqXqvoaMBPYOlcLHcdxnFxktdF3UdW3w+t3gC7h9TrAc4nPzQn7HMf5\nH6LbaQ9GlTf7wr2q+ty9997L/vvvz7Rp0+jVq1eq7/jNb37DDjvswK677pqliVVx0003MX78eK6+\n+uqafUclci/GqqqKSOoK4yJyLHAswHrrrZe3GU0zdNUqPjO/tm2oFdX8Nlj2v6/Ife7ULcOHD2e7\n7bZj+PDhnHPOOamOPffcc2vUqip4a1IVH2qbWXxWP/p3RWRtgPD8Xtg/F1g38bmuYd9SqOp1qtpP\nVft17txsqgbHcZwm+fTTT3n66ae54YYbuPPOOwF4++232WGHHejTpw+bbropTz31FAsXLmTIkCFs\nuummbLbZZlx22WUADBkyhJEjRwLw0EMP0atXL7baaitOOukk9t57bwCGDh3KD37wA3baaSc22GAD\nrrzyysXff9ttt7H11lvTp08fjjvuOBYuXAjAsGHD6NmzJ1tvvTVjx45dll2ymKyK/n5gcHg9GLgv\nsf9QEVlJRLoDPYBx+ZroOI7TPPfddx977LEHPXv2ZI011mDChAnccccd7L777kyePJkXX3yRPn36\nMHnyZObOncvUqVOZMmUKRx11VAM5X3zxBccddxwPP/wwEyZMYN68eQ3enz59Oo8++ijjxo3jnHPO\n4auvvmLatGncddddjB07lsmTJ9O6dWtuv/123n77bc4++2zGjh3L008/zSuvvLIsu2Qx1bhXDgee\nBTYSkTkicjRwIbCbiMwAdg3bqOrLwAjgFeAR4ERVXVirxjuO45QYPnw4hx56KACHHnoow4cPp3//\n/gwbNoyhQ4cyZcoUOnbsyAYbbMCsWbP4yU9+wiOPPMIqq6zSQM706dPZYIMNFvusH3bYYQ3e32uv\nvVhppZVYc801WWuttXj33XcZPXo0EyZMoH///vTp04fRo0cza9Ysnn/+eXbaaSc6d+7MiiuuyCGH\nHLJsOqOMZm30qnpYI28NauTzvwN+l6dRjuM4afjwww/55z//yZQpUxARFi5ciIhw8cUXM2bMGB58\n8EGGDBnCT3/6U4488khefPFFHn30Uf70pz8xYsQIbrzxxqq/a6WVVlr8unXr1ixYsABVZfDgwVxw\nwQUNPnvvvfdG+4158Fw3juMs94wcOZIjjjiC119/ndmzZ/Pmm2/SvXt3xowZQ5cuXfjhD3/IMccc\nw8SJE3n//fdZtGgRBx54IOeddx4TJ05sIGujjTZi1qxZzJ49G4C77rqr2e8fNGgQI0eO5L33bLny\nww8/5PXXX+eb3/wmTz75JB988AFfffUVd999d/TfXg2eAsFxnOhU6w4Zi+HDh/OrX/2qwb4DDzyQ\nIUOG0L59e9q0aUOHDh245ZZbmDt3LkcddRSLFi0CWGoU3q5dO6699lr22GMP2rdvT//+/Zv9/t69\ne3PeeefxrW99i0WLFtGmTRuuueYaBgwYwNChQxk4cCCrrbYaffr0ifejUyCqqT0jo9OvXz+taeGR\nIrv6uXulUwdMmzaNjTfeuKWbEY1PP/2UDh06oKqceOKJ9OjRg1NPPbV2X1iFe+W0+W2X6mMRmaCq\n/Zo71k03juM4ZVx//fX06dOHTTbZhPnz53Pccce1dJNy4aYbx3GcMk499dTajuCXMT6idxzHKTiu\n6B3HcQqOK3rHcZyC44recRyn4PhirOM48anW7bdqeU274rZu3ZrNNtuMBQsW0L17d2699VZWW221\nuG1IMH78eG655ZYGSc0qsc022/DMM8/UrB3V4iN6x3GWe9q1a8fkyZOZOnUqnTp14pprrqnp9/Xr\n169ZJQ/UhZIHV/SO4xSMgQMHMnfukuzoF198Mf3792fzzTfn7LPPBmD27Nn06tWLIUOG0LNnTw4/\n/HD+8Y9/sO2229KjRw/GjbOku+PGjWPgwIH07duXbbbZhldffRWAJ554oqrUxR06dFj8+Z122omD\nDjqIXr16cfjhh1MKVn3ooYfotcMBbLXH9zjprN+z95EnRe8TV/SO4xSGhQsXMnr0aPbZZx8AHnvs\nMWbMmMG4ceOYPHkyEyZMYMyYMQDMnDmTn/3sZ0yfPp3p06dzxx138PTTT3PJJZdw/vnnA9CrVy+e\neuopJk2axLnnnssZZ5xR8XsrpS4uZ9KkSVx++eW88sorzJo1i7Fjxy5JiXzbVUx45A7mffCfmvSL\n2+gdx1nu+fzzz+nTpw9z585l4403ZrfddgNM0T/22GP07dsXsNQGM2bMYL311qN79+5sttlmAGyy\nySYMGjQIEWGzzTZbnNBs/vz5DB48mBkzZiAiFRU4LEldvNJKKy1OXdy1a9cGn9l6660X7+vTpw+z\nZ8+mQ4cOlhJ5Pau4eth+e3DdbX+N3j8+onccZ7mnZKN//fXXUdXFNnpV5fTTT2fy5MlMnjyZmTNn\ncvTRRwMN0w23atVq8XarVq1YsGABAGeddRY777wzU6dO5YEHHuCLL76o+P2VUhdn+UytcEXvOE5h\nWHnllbnyyiu59NJLWbBgAbvvvjs33ngjn376KQBz585dnEq4GubPn88669ho+6abbore3sUpkd98\nC4C77n8s+neAm24cx6kFLZiZtG/fvmy++eYMHz6cI444gmnTpjFw4EDAFkdvu+02WrduXZWsX/7y\nlwwePJjzzjuPvfaKn3p5cUrkw39M+5Xb0n+LTaJ/B3ia4sRnltOUuZ6m2KkDipameFny6aef0uHj\nGZYS+YwL6dF9XU499vtLfc7TFDuO4yynXH/99fTZ7VA22fkg5n/yKccdcWD073DTjeM4Tgty6qmn\ncuohO9X0O3xE7zhOFOrBDFxU8vatK3rHcXLTtm1bPvjgA1f2NUBV+eCzBbRt2zazDDfdOI6Tm65d\nuzJnzhzmzZvX0k1ZPvmoKZdPpe38WXQd9MPM4l3RO46TmzZt2tC9e/eWbsbyy9ABzX9mjxMyi3fT\njeM4TsFxRe84jlNwXNE7juMUHFf0juM4BccVveM4TsFxRe84jlNwXNE7juMUHFf0juM4BSeXoheR\nU0XkZRGZKiLDRaStiHQSkVEiMiM8rx6rsY7jOE56Mit6EVkHOAnop6qbAq2BQ4HTgNGq2gMYHbYd\nx3GcFiKv6WYFoJ2IrACsDLwF7AvcHN6/Gdgv53c4juM4Ocis6FV1LnAJ8AbwNjBfVR8Duqjq2+Fj\n7wBdcrfScRzHyUwe083q2Oi9O/B1oL2INKh/pZaztGLeUhE5VkTGi8h4z3jnOI5TO/KYbnYFXlPV\near6FXAPsA3wroisDRCeK+bfVNXrVLWfqvbr3LlzjmY4juM4TZFH0b8BDBCRlUVEgEHANOB+YHD4\nzGDgvnxNdBzHcfKQOR+9qj4vIiOBicACYBJwHdABGCEiRwOvAwfHaKjjOI6TjVyFR1T1bODsst1f\nYqN7x3Ecpw7wyFjHcZyC44recRyn4LiidxzHKTiu6B3HcQqOK3rHcZyC44recRyn4LiidxzHKTiu\n6B3HcQqOK3rHcZyC44recRyn4LiidxzHKTiu6B3HcQqOK3rHcZyC44recRyn4LiidxzHKTiu6B3H\ncQqOK3rHcZyC44recRyn4LiidxzHKTiu6B3HcQqOK3rHcZyC44recRyn4LiidxzHKTiu6B3HcQqO\nK3rHcZyC44recRyn4LiidxzHKTiu6B3HcQqOK3rHcZyC44recRyn4LiidxzHKTiu6B3HcQqOK3rH\ncZyCk0vRi8hqIjJSRKaLyDQRGSginURklIjMCM+rx2qs4ziOk568I/orgEdUtRewBTANOA0Yrao9\ngNFh23Ecx2khMit6EVkV2AG4AUBV/6uqHwH7AjeHj90M7Je3kY7jOE528ozouwPzgGEiMklE/iIi\n7YEuqvp2+Mw7QJdKB4vIsSIyXkTGz5s3L0czHMdxnKbIo+hXALYE/qiqfYHPKDPTqKoCWulgVb1O\nVfupar/OnTvnaIbjOI7TFHkU/Rxgjqo+H7ZHYor/XRFZGyA8v5eviY7jOE4eMit6VX0HeFNENgq7\nBgGvAPcDg8O+wcB9uVroOI7j5GKFnMf/BLhdRFYEZgFHYTePESJyNPA6cHDO73Acx3FykEvRq+pk\noF+Ftwblkes4juPEwyNjHcdxCo4resdxnILjit5xHKfguKJ3HMcpOK7oHcdxCo4resdxnILjit5x\nHKfguKJ3HMcpOK7oHcdxCo4resdxnILjit5xHKfguKJ3HMcpOK7oHcdxCo4resdxnILjit5xHKfg\n5C08UjuGrlrFZ+bXvh0Nvi9im4r++2JRj31ejZyYsurx99Vjm2LKWp6v4wr4iN5xHKfguKJ3HMcp\nOK7oHcdxCo4resdxnILjit5xHKfguKJ3HMcpOK7oHcdxCo4resdxnILjit5xHKfguKJ3HMcpOK7o\nHcdxCo4resdxnILjit5xHKfguKJ3HMcpOK7oHcdxCo4resdxnIKTW9GLSGsRmSQifw/bnURklIjM\nCM+r52+m4ziOk5UYI/qTgWmJ7dOA0araAxgdth3HcZwWIpeiF5GuwF7AXxK79wVuDq9vBvbL8x2O\n4zhOPvKO6C8HfgksSuzroqpvh9fvAF1yfofjOI6Tg8yKXkT2Bt5T1QmNfUZVFdBGjj9WRMaLyPh5\n8+ZlbYbjOI7TDHlG9NsC+4jIbOBOYBcRuQ14V0TWBgjP71U6WFWvU9V+qtqvc+fOOZrhOI7jNEVm\nRa+qp6tqV1XtBhwK/FNVvw/cDwwOHxsM3Je7lY7jOE5mauFHfyGwm4jMAHYN247jOE4LsUIMIar6\nBPBEeP0BMCiGXMdxHCc/HhnrOI5TcFzRO47jFBxX9I7jOAXHFb3jOE7BcUXvOI5TcFzRO47jFBxX\n9I7jOAXHFb3jOE7BcUXvOI5TcFzRO47jFBxX9I7jOAXHFb3jOE7BcUXvOI5TcFzRO47jFBxX9I7j\nOAXHFb3jOE7BcUXvOI5TcFzRO47jFBxX9I7jOAXHFb3jOE7BcUXvOI5TcFzRO47jFBxX9I7jOAXH\nFb3jOE7BcUXvOI5TcFzRO47jFBxX9I7jOAXHFb3jOE7BcUXvOI5TcFzRO47jFBxX9I7jOAXHFb3j\nOE7BcUXvOI5TcDIrehFZV0QeF5FXRORlETk57O8kIqNEZEZ4Xj1ecx3HcZy05BnRLwB+pqq9gQHA\niSLSGzgNGK2qPYDRYdtxHMdpITIrelV9W1UnhtefANOAdYB9gZvDx24G9svbSMdxHCc7UWz0ItIN\n6As8D3RR1bfDW+8AXRo55lgRGS8i4+fNmxejGY7jOE4Fcit6EekA/BU4RVU/Tr6nqgpopeNU9TpV\n7aeq/Tp37py3GY7jOE4j5FL0ItIGU/K3q+o9Yfe7IrJ2eH9t4L18TXQcx3HykMfrRoAbgGmq+ofE\nW/cDg8PrwcB92ZvnOI7j5GWFHMduCxwBTBGRyWHfGcCFwAgRORp4HTg4XxMdx3GcPGRW9Kr6NCCN\nvD0oq1zHcRwnLh4Z6ziOU3Bc0TuO4xQcV/SO4zgFxxW94zhOwXFF7ziOU3Bc0TuO4xQcV/SO4zgF\nxxW94zhOwXFF7ziOU3Bc0TuO4xQcV/SO4zgFxxW94zhOwXFF7ziOU3Bc0TuO4xQcV/SO4zgFxxW9\n4zhOwXFF7ziOU3Bc0TuO4xQcV/SO4zgFxxW94zhOwXFF7ziOU3Bc0TuO4xQcV/SO4zgFxxW94zhO\nwXFF7ziOU3Bc0TuO4xQcV/SO4zgFxxW94zhOwXFF7ziOU3Bc0TuO4xQcV/SO4zgFxxW94zhOwamZ\noheRPUTkVRGZKSKn1ep7HMdxnKapiaIXkdbANcCeQG/gMBHpXYvvchzHcZpmhRrJ3RqYqaqzAETk\nTmBf4JVqBXT74o5mPzM7Y+OyErNN9fj7nOqo5r+D5ff/q8fz3Ps832+rlelmHeDNxPacsM9xHMdZ\nxoiqxhcqchCwh6oeE7aPAL6pqj9OfOZY4NiwuRHwahWi1wTej9DEWHJiyqrHNsWU5W1a9rK8Tcte\n1rJu0/qq2rk5QbUy3cwF1k1sdw37FqOq1wHXpREqIuNVtV/exsWSU/Q2xZTlbVr2srxNy15WPbYJ\name6eQHoISLdRWRF4FDg/hp9l+M4jtMENRnRq+oCEfkx8CjQGrhRVV+uxXc5juM4TVMr0w2q+hDw\nUGSxqUw9y0BOTFn12KaYsrxNy16Wt2nZy6rHNtVmMdZxHMepHzwFguM4TsFxRe84jlNwXNE7juMU\nnJotxtYLIrJeU++r6hvLqi0l6rRNOzT1vqqOSSEryu+rx36CuH3lLL8sT+dBXS7GisiRTb2vqrek\nkDUFUECSIoDOwFqq2rpKOcPCcY00SY9e1m0Ksn7TxNuqqr+tUs4DlY4HNgfWTdmmWH0es59eo+H/\nJ4ltVdUNU8iK0lci8jhNn1ODUrQpyvkZ+dqLKStKX9XjeRBkfZJoR+l8V2wwvqKq5hqU1+uIvn8j\n+/fBcuZUfYKo6mbJbRHpBvwK2BU4P0Wb/l5h37rAqVisQNVEbBPAZxX2rQwcA6wBVKXoVfU7ZW3a\nFjgTeAf4SZoGxfp9kfupPMKwFXAw8HNgUhpBEfvq5xX2DQB+CbyXpk3EOz+jXXuRZcXqq3o8D1DV\njmWyOgAnAscBf0sjq7EvqOsHdnf7PjAFuAvYPKOcHsBNwDRMCbbJ0aYNgL8A/wJ+hN1xW7RNQV5H\n7ER7DbgIG/WmlTEIeAJ4HNgtZ3ui/L7I/10rYDAwFbgN6J1DVsy+2hH4B/A0sGdOWbHOzyjXXg1k\n5e6rOj4PVgOGArOA84A18shbLDeGkFo8sNnGMcD0cJFvlFHOpsBw4KVworXO0aZe4aR4GRgCrNDS\nbQryOoWT4rVwkqyeQcZewDPAw8B2OdsT5fdF/u/aYKOj6UEJfiOHrJh9tTvwVFBcO+eUFev8jHLt\n1UBW7r6q4/NgTeCCoODPBFbNI6/8Ua82+hOBk4HRwEWqOjuHrIVYyuQHgYXl76vqSVXKuRvYCrgU\nGFEuS1U/XNZtCrIuBg7AouiuUdVPqz22TM4iLJ30i1SwharqPilkxerzmP00B1gAXA4stYirqvek\nkBWlr0TkBWy94WLg2QpyJqZoU5TzM/K1F1NWlL6qx/MgyPoMmAcMAz6pIOsP1cqqKL9OFf0izO42\njwoLJ6q6eQpZg5t6X1VvrlLO7ERbllogVNUNlnWbgqxFwJfYyVupr1apUs6OzbTpyRRtitXnMfvp\nJppezPtBCllR+kpEnmimTbukaNNsIpyfka+9mLKeIEJf1eN5EGQNDe0q/+9Kss6pVlZF+XWq6Ndv\n6n1VfT2n/FZAB1X9OI+cvIjId1X17ub2LcP2tAZuUdXDI8tdBbuIlhqpVHl8tH4Ske6q+lpz+6qQ\nU5O+amliXnu1vo7rBRE5AHhQVb/MKac1cJKqXhanZQnZ9ajoa4GI3AEcj01pXwBWAa5Q1YszyDoA\n2A67+z6lqvdmbNNEVd2yuX0p5G0H9FDVYSKyJtAxgwJ7GthFVf+bpQ1lsvphU9GO2CjlI+AHqjoh\npZxo/dSIrAmqulUGWVH6SkRWBn4KrKeqx4pID8yWXcmTpjEZTfZFGjNQbETkIlX9VXP7qpR1InC7\nqn4UtlcHDlPVazPI2gvYBGhb2qeq52aQMwzYBRiDLTQ/oqoL0soJssap6tZZjm1Sbj0rehEZAFwF\nbAysiLmJfVatOaJM1mRV7SMihwNbAqcBE9JMH4Oca4FvYIuEAIcA/1bVE1PI2BP4NubWdVfirVWw\n1f/Uf7SInI25jm2kqj1F5OvA3aq6bUo5t2D9fT8J180sNkIReQk4UVWfCtvbAddW2+cx+0lEemEX\n9e+BX5TJ+oWqblKtrITMKH0lIncBE4AjVXXToPifUdU+KWQ8Hl62xc6DF7Gb6+bAeFUdmLJNMa+9\nSjfXl9Jee+G4yeX9IiKTVLVvSjl/wtyQd8YWZQ8CxmmKeJgyeW2APTF9sB0wSkOFvZRyLsMWjO+i\n4TmV60Zdr370Ja7GipbcjZ28RwI9M8pqE/6M/YCrVfUrkaVMYdWwC7CxhjukiNyMeTmk4S1gPOZP\nnBzdfoL5PWdhf6AvMBFAVd8SkY5NH1KRf4dHK2wknoeFJSUf2vS0iKQZ6cTsp42AvTH3taT/8yfA\nD1PKKhGrrzZU1UNE5DAAVf0/SXlyqurOACJyD7Clqk4J25tinlhpyX3ticiPgBOADcNNv0RHYGyG\nNgG0FhFJXH+tsRtRWrZR1c3DDeccEbkU857JRNAnD2Oz/HaYnkmt6IHSTSw5s1BM72RHI7rwxH5g\nIxGAlxL7JmWUdRJWzvAhbKSzPmZ2SSvn71idxtL2+sADGdvUJvF6dfL5Fo8LzxPDc/tkv7XQ/3c5\n8GdgJ8z3+VrgD9iMassW6qeBNfidK+c8/hlMOZT+uw1L/2cGWS9Xs68KObmvPWBVoBs2+10/8eiU\no68uxryKBoXHCODSDHKeD8/PAV8HVgJmZmzTnpjr6Ozw/G0yurbW6lHvI/r/EytFOFlEfg+8TfZE\nbA+o6pWlDRF5A6h6hT1BR2CaiIwL2/2B8SJyP6RzqQJGicg+2MxqAvCeiDyjqllG9SNE5M/AaiLy\nQ+y3XZ9WiFhYd7k9bz42sv6zqn6RQtwW4fnssv19STdKidlP+4vIy8DnwCOYaeNUVb0trSARGQjc\nAHQA1hORLYDjVPWElKLODm1ZV0RuB7bF/OCzMEVE/oL50wMcjsUhpCX3taeq84H5InIm8I6qfiki\nOwGbi8gtGuzsKfkV5gf/o7A9CjO9pOXvIrIaduOYiJ2PWeSAzXbuwv77vAuyXbCo76+r6p4i0hsb\nnNyQS264I9UlYdX+XWxqdio2QrhWVWdmkBVlES6yS9UkVe0rIsdguTHOzmq7DPJ2A76FzVgeVdVR\nGWRcgfkrJ9cgPsYuhFVU9YgsbctDzH5KrNXsj5lyfgqMUdUtmjm0kqznMdvu/RpsxCIyVVU3zSBr\nDSykX4DnVPX9tDKCnLaYEiwl3BqDXTOpFFDka28yZv7phs2o7wM2UdVvp5VVC0RkJaBtuDG1dFse\nxhwYfq2qW4jICthMarNmDm2Seh/Rvw/8N4wizwn2uJXSCEgswq0avGVKrEJitb1aVPXJcNct5fEY\np6pp85KUWEFE1sYWG3+dUQYAItIe+KeqjhKRjYCNRKSNqn6VUtQ2qprMUfKAiLygqv3DSDhNm1bF\nRqslpfMkcG6GCypaP2ELXWBRjXer6vyMazUAqOqbZccvFdhVJTuyxJOrDdnzmxyn5p632EVPRE4G\nrkgpJ/e1l2CRWh3pA4CrVPUqEUmVV0ZERqjqwbIk0d3it0jpkx/kLfbeCTONlUXkBE3hvSMNE5Et\nhWZYuAbWVNURInJ6kLFALHAwF/Wej340tjJeoh0W/pyG8kW40mNLMizCicjBwDjgu5jieV5EDkor\nJ3AuVkB9pqq+ICIbADMyyhoDrCQi62BmgCMwe2FaOkgiPXB43SFspnUjvBFb7Dw4PD7GRitpidlP\nD4jIdCyKdLSIdAbSmKOSvCki2wAqIm1E5OdYPp5UiHlyHY/lgZkKHCci12RsU6UgsyEZ5MS49kp8\nFRaaj2RJ8rU2TXy+EieH571peB2XttPyw6TpSFX/Q0p9oKodgzK/AvPiWwfoipmXLs/QJoDPwuyu\ntNg8ADOd5qOlFwmaegCTq9lXhZzWwBmR2vQiiWRhmJnjxYyyoiQsCrJKC3k/AX6Zo6++jYWGP44l\nanodG/22B05pof8vWj8FeZ0IeXPC7/paRjlrArdjJo73MLt46rZieVcksd0KmJZSxmHAA8B/MHfP\n0uMJYHSGNkX578JxvYErMX93gO7ArzLKag+0Cq97Yh5ZqZPcYTfVZJ+3JsOidTh2qes/h07YEvNI\nmh+e/0UO54PSo95NN5+JyJYafEhFZCtsES0VqrpQRPYjfWrbSrTShqaaD8g+M3ou2C+HAQ9r+Kcz\nImFx8HCg5AucKn0ygKo+JBaw0yvselWXLMCmHaV8LiLbqerToYHbkuH/I2I/icgEbAF1OPAfVf2M\nyqmeq+FTjRMZOxNYD7upgqUXTmsLfwZbMF0Ty3dT4hOyLcZGufYCG2KDhEUAakF8F2WUNQbYXixQ\n6jEs+PEQ7LxPwyPAXcGBAWyB95GMbfpMLD7nTmwkfhgZzylVnRjWATfCzFKvanrz61LU+2Jsf6zz\n3sJ+9NeAQzRlZGWQFSUQQSyJ2OY0XKx8SbNF+QmWW/0HmM1/BHCTqv4rg6wdsJzaY1X1omDeOEWr\nTyB2QFPva4pkTwmZW2A5x1cNu/4DDFbVVIoncj99AzgK+9/GYzePx7LcPERkJjaafyo8ntYMC3oi\n8iT2uxoLvVVlAAAgAElEQVR4chGm7JrOk6skcw1sbeSNjNdLzGvvNmAg8FfgRlWdnlZGQtZEVd1S\nRH4CtFPV30uFIKoq5LTClHupYMko4C+qmtoeLlYn4QrMW0qxkfgpmjGJWzAHdiOxhqopirRUlFnP\nih4WR5xtFDYz391kSeRgEtUUiaMSskopEMB88XMXBhCRnbGpf3vMPHSaqi6Vpa9WiCWgmhwewFJJ\nsVK7okrIISOW6wZV/Vgy5JUpkxmln8KFvjfwR2wBdRiWEqPqLKRBznrA9thF/m3gowxKJ7cnl4j8\nHeuLqWHheiJ2s9gQuE5VU9uMY117QdYq2Ej3KEwZDgOGa8r8R2ER9wRssfloVX1ZRKZoTq+U2IhI\nf1V9IcNxt2L/2WSWLOxrtQO2RuXWo6IXkV1U9Z+NjTKzjC5jEDwP/qEhCjGCvDWwPOtHYCPDGzC7\nah/MI6R7Clk9sRF9NxqOBKrN6rcfFgn5Dcz9bbhmcKUrkxnLpTVaPwV5m2MK59vYIu/t2I37iDRK\nWkS6Ykp+Ryxm4ENsVH9BmvYEWbk8uUTkZQ1pHETkDKCXqh4pFh09VqtPO1Gzay/8j0cAp2CL1t8A\nrlTVq1LIyDtzbcx7B4Bq+6kR2b2xm9lh2A2/vJpVNTKmYek9oirmerXR7wj8k8qr6QpkMSPkdvUL\ntv5FIrJqlil6BZ4FbgX2U9U5if3jxXJxpOFu4E9Y0Efq6adaYrZ7g5vmvsCl4cL8dTUjyiQS2aWV\niP0UbPQfYTeL03SJf/nzYQ0hDW9gNuLzVfX4lMcm23QwFrjzBDaTukpEfqGqI1OISY62BxGC5VT1\nkzBbq5ZaXHv7YDfWb2CmvK1V9T2xnD6vYDl1qkKt4PaYxPYsLOq9WpLeO7kJZpuScv8Ki/ztl9Vs\ng3ldfQ1bb4lGXY7oYfHU+iBVHRFJ3l+xTizlMD8C2EJVm7RNV5BzHxbZOYqGtv7UUyuRJTk78pJl\npNyInNbAHtjofjPMO+LRlDL2xXJ97IONvEt8Atypqs+klBeznzYIyiGGrC2wmcAO2GLqDOBJTRnF\nKCIvYiXo3gvbnbGZY9VBXGIRzY9hhTBuBLqr6kci0g5LZ1B10rYaXHs3AzcEJV3+3iBVHZ1CVmes\nTmx51sk0ufujzMxF5Fls8HIndl7PEJHX0s4wg6xSRHpHbKY6DqszAWRbp2kgv14VPYCIjM8y/WlE\nVqWsd1kWcSr5KaPpimBUSjOQlJVl8W0o5uL3NxqeINVWFtoFU+5bY/7Sd6rq+LTtKJO5vSaSmoV9\nVdvoY/aTiPy0qfc1YwUfsSLO22EmnO8HWeunlNHAxhwU7Ytp7M4ishYWb7A2VmnssbB/Z2ArVb0k\nZZuiXXsxEZHHMIeKn2OxB4OBeZrSGUJERgMH5JmZi8i9mDvk/cAdqvqMiMzSFEWIErKiRdxXlF/n\niv5CLEKv3FMm1YJZkPUslo426ep3iaZM3xqObYflDn817bHh+Oh/qohUUp5a7UkXpvcvYQWXlTIF\nm3HGMhYr3vxx2N4Ys6lXlSIgZj+JpXFuSlbqCj4iMh6LFn2G4HmjGYppSERProTMvMVecl97snTk\nqLCkgpJqtpTHE1R1K0mkwJAQuZ1STpSZeTAJH4CZbnpggZm7q+q4Jg9sXF574HNVXRTW3XphLsW5\nXCzrXdHnUl5lsvpgZptVsRPtQ7K5+n0HuARYUVW7B7nn5p1atTSNzVRKpJmxJGTuhU2z98K8N24B\nDlfVyU0euJwgIp1VdV4kWVE8uSResZdo115MROQ5VR0gIo9iQVhvASNVdcOUcnLPzCvIXAu7SR+K\nDQTXzSBjAjY7XB1z03wBS0WRL15Dc0ZcLW8PzKa2So7jJ2A3i0mJfVMzyuoBjMQWpGaVHhllrYxV\nj78uIXvvDHI2jNzf+2Ej3ilAzzrop7bAiVjK5BtLj4yyumCLug+H7d6Yy18aGa2BxyP290vA9ont\n7WjhdNWJtqyFrWWshynCLDL2Dtffplj09gRgnxTHjw7PF9Xg962CVXWDRCrzlDIqRbhnirJNPuo6\n141YoqEzReS6sN1DRDKtlovIGiJyJebZ8LiIXBG8StLylS5t10vj1ZBkGObHvQCrdHMLS9LLZpH1\nX2CbsD0XOC+DnBtF5N8icqeInCgiqf2TReQqEbky9Pcu2IX5GvDjsC8tMfvpVsyrYXfM86ortkic\nhZsw98yvh+1/Ya6DVaMWoLMomABisFSxF6zfUhH52ttHRGZg58CTWN72TEU+VPXvqjpfVaeq6s6q\nupWq3t/8kYtZWywgaR8R6SsiWyYfWdokIv3F3DVfAqaGxfU1s8gycYsj3B8M+3Lr6Xp1rywxDLtj\nJ5XX3SxJjJSGOzG3rAPD9uGY/XHXlHJeFpHvYZVuemCuXam8SBK0U9XRwavkdWBomLr9JoOs3FWK\nwnE7iuUh748VDHlQRDqoaqcUYsoXcVNHU5YRs5++oarfFZF9VfVmsVrCTzV7VGViZRr8FMsjn9uT\nC3hSLKx/OGYPPwR4oqTEtPpI8JjX3m+xFMz/UEs3vTNh4bpaxNIvH4JFVz+AmQS3xyp8/VarT+v8\nG+As7AZfvgCvZKvkdANwgjYsmTkMW3dJyynA6cDf1ILBNsBmLrmod0UfRXkF1lbV3ya2zxORQzLI\n+QmWKvdL4A5sRPfbJo9onC+Dh8UMEfkxdjF1aOaYxvhvWCQuZb3bkIT3TbWEk3T78FgNu7BTKUKt\nYOcUy02yrqZcEwnE7KfSotZHYmX23sFMClmIlWnwHjL4pzdCrGIvMa+9r1T1AxFpJSKtVPVxEUkb\nqXsL9t+1B36GuUpfjZmmbqJKv3i12ISRInJWmT7IQ96Smcn2PYnNekrbaeMEGhVctw/illj7A7ZI\n0io8Dsa8btLK+W41+6qU1R9TWF2xEcA9wICMsnYLJ8g8LNJzNrBTBjkLgOcx2/qKOf+/JzC7ZSds\n2v488IcW7qdjsIWuHTFb/3vA8Rll1STTYD08Il97/wj/31XYTOMKrPh5GhlTw/MKWLWq5Hu5bNjh\nt51F9uyVuUtmApeH5wdomH30fqywTa7/s969bnbDFhh7Y8Eg2wJDVPWJDLI+wUYDpal1a5ZMk1Wr\ndPWSymH9S+1bVojItqo6VqxKTgdyVikSK6+2LRYE1B9bf3hWVc/KICtqBa16RKwCUK5Mg8HDpVI4\nfhbvsijFXiJfe+2xnP+CmUxXxYp+fJBCxuJrrPx6y3L9icjXMVPQ97DAwAuAezQUVU8pqynTimoV\nwVwispWqTpBGXIq1yH70QCk/Rl7lJZiieSNHO/bEcqMcjNn2S6yC5abYOoPMnsAvsLDp1PlpgoyS\nX3G0m42Yv/uOmPlmGywDYpM+7Y3ImYKVNrwZS6XwQhZFH6OfErJWwtZpupXJOjeFjKj5YMqcAtpi\nRW06qWrqNQiJFAGeaFfu8oYxEJH3sHU2wRT0naW3gINVtUuVco7FfN7XwbKgjgDu0wzRrMsT9W6j\nB/tDWmNt3UFEUl9Iqqoi8iB2587KW9gi4z40XFz8BKupmYVSfprryV6C7qvgGdG1kkeLpg8AmYUV\nwnga83Q5SlXTVpYqUaoMNVbzVYaK0U8l7sNMLRPIsIYRiJoPpsLI9vKci/IHJrbPEcvln4Xc1x4s\njhG4CFsLEbIFTP0i8bp8sT9NBPfVWO6k72mI/BaRXKPdGLMoaSTJGmQrlbiUkHoe0YvIjdjK9css\ncWFUzZYy92bgas2QOrRMTpY6rI3Jyp2fRkTWxDyHLqKCYtCUASBhsSyru2hNiNFPCVmZinc3Iqu1\nZshfXkFOcibWCiuk/SPNVrA8SgR45GtvJvAdVU1dZrEJmZkif8Ms5bvYqP5r2Ih+iGYIbkrIzD2L\nEivG3iiaIeK6gfw6V/SvqGrvSLKmY9nzXsds81mLCm8LDGWJGaEkJ4s9dSg58tOUydpCVV9Me1wF\nOV2xRbNSJsengJO1YdbIamX1xGYFXVR1U7H0wPuoair//sj9dB1WoDq1LbaCrDcIlYqwwuyZLqYy\nG+8CbOH6Us2QYkPiFXuJee2NVdW0mUEbkxUl8jfI6oqZgQ7D1u/+pqpnZJATJY9W4tivYTmnFHhB\nVd/JIqcBeVdza/nA/FN7R5K1fqVHBjnTgT2xaegapUfGNr1W4ZE14rMnVtC55J2wOXBmBjmjsJSy\nK4THEGBUxjY9GU7YXFHEkfvpFSyw7FUswGUKGSNHsWjkgzFTzWyCu1+M8zXrA+genhdHgJf2pZQT\n89q7ArsZHoblhTkASyiWRVZNIn/D9fObjMc+m/zfsUHSsxllHYOlv74JmyHMxm5k+X5frU64SCfI\njpg9NfNFmTjZO1V6ZGjT8zX+zZlcGiMq1ZhFoV8Iz5PyyorYT1Fu+BXkro6NpBemOObyxOuTy967\nKWM7JlbYNyGDnNzXXkLWsAqPrGknJlXYt9RvbuL4XyZef7fsvfMztmkLrNrZ7PCYREY329DfayS2\n18C8uXKdn/W+GHsDZu+aQvY0A3dgwRQTqJxJL63J5XGxbIP30NCMkKr2bJLgFbQL5uq1N5ZDJS0r\nq+q4spiWLEEbH4jI91mSSfEwrAB6Ft4PgVsKICIHkaOgQox+0oStM7j97Y/9xr0ytmlHbPq/B7Yo\neHCKw3dIvB6MjXxLpDUpxi72EuPaA0BVjyrfJ1aTNgtPSr7I30OB34fXp2ML/SX2AFKbboCPVXUL\nKSuZmUEO2LWWXHf4hOzX32LqXdHP03R5LJZCVfcOz91FpBOWICvLiV/im+E5matbyRA6HSIpv4cF\nJ3XCkm39PGO7YinVH2A2+suCrGcwU04WTgSuA3qJyFzM5JI6C1/MfhJL77BXkLc7VrA6bTWvkqzZ\n2OhtBLYA+lnTRywtopHXWdgIu/mtRkNvoE+AH2aQl/vaK0fKSu3R8BqqlryRv031edb/4K9YYNTH\niX0jgaodCGRJvYSZWLWz+7Dfsy82o8pFvSv6SWK5SB6g4eg5i4vXMVgZsa5Y4d0BmBIb1NRx5WiE\nerEicj628v8GNjI5B6sClDlFKpGUahjxRkm5rBa+vWsYObfS9B4S0fpJRL6FKZhvYblDbgH6Vxpt\npmDzsos7La3EUkO0SrwuKZvWaQSp6n3AfdJIsZcMbYty7UnkUnsRrj9t5HWl7SaJPIvqGJ7/HR4l\n7ksppyL17nUzrMJu1WwuXlOwSM/nVLVP+JPO1ypdoCRihaIQ/PEvLHT6AVX9UrJXpilvVztMcXyW\npl0ichVNV3NK64+/EXAsVjgBrBj0dar6rxQyYvbTIsyDaIiGCldZZSVk5vIqCjOCRVQeSWrG35mr\n2EtCTu5rTyKW2kvIzOWzLpZ0ruR11w74v9JbQFtVbZOiLVFLZtaSuh7RR7btfaGqX4gIIrKSqk4P\nyqhaOjb/kapZG8tNcxgWHPM40E5EVlDVtHb1Urs2wm5k92En7RFY3clqyVU2MIlYmtV7sPwf14X2\n9MVsqQeo6nNViorZT1ti9tl/hKCwO0k5aq7A9Vggz58BVPWlMAquStGrarec31+J84EHxIq+LC72\nklZIpGvvXSzoqgvQGQuWyzuyvBHzWS+thRyBLe5WNWBT1bz/eVJW7FlUydV2qT7SDFHg5QLq/oHl\n2/gtZr8an1HG3zD75VAsXfF9wEN18NtKIfkjsQvjjoxyxhCKHoTtjsCYFMffGp5PzvL9ZbIepkJC\nNcyT4+GW7KcgaxtsHeKt0NZjM8qJ5lWEKao/AJcC++Xs/9zFXhKycl17mD//UVi+nNcwv/6tc7Qn\nl1cYjXjfkdELL8gcS6KYEbAx2YsRbZV4bBvOid/n+Q9V6zipWWzbXpnsHbET8BFNGd4vlhf7aJau\nQp/FnLSSqn6Z2F4F2FdVb80g61XMZvxlSTbmDlfVrEVEXsEibB/GsvA1MCdoulqh/1LVno21s9o2\nNSG/I7C/qt6SU04r7DcfmvH/exj4MWYa2TIsgB+tqnumlHMtFsyXrBn7b1U9MYWMctPbIMzWOxvS\nmd5qde2Jldo7OMjNWmovV+SvLEkgJ1ilq/+E16thOZ1Sj8SlxiUzRWScZsillaQuTTdltr0DdYlt\nb3YM+ZovE9ytWNDU7lgul8Mx+3MW7hGR/XRJSoWVscIDqRU9dnKNE5FSrdH9sKCLavkTFnC1AeaK\nmlT0ad1Qm1p0rdozpbl1kbSIZZrck4brBo+o6mMZRVZaAE9VUCOwC7CxhlGXWLqOl1PKiFLspRbX\nnoh8V1XvVtX3sKCyq0XklxnFHQ/cIksqcv0Hc02tipIiF5HrsUjYh8L2ntg1kxpVfVBE2mCzltIg\npOq1qCTBM7BEKR1G7upjdanoqY1tLxYxKxTdC4wII8F1sQWdTG6Dqvq7MMLcPuw6SlUnpTj+SuBK\nEfmjqv4oSxsSrCuVSwYK9r9WS7R1ERFZB0tE9jbmEimYO+KlIrKTqqZ2RdWcXkUJZmKjy5KP/7ph\nX5q2xCr2Uotrr9xfHRr6s6chls/6AFVd7Haqqg+LSKr2VJhFrYrNon4slgAuS8GQZLzPAmxGdnQG\nOQ2oS0WvqvuFO/YBWNm4HsBqIrK1qqZZYKwF0SoUqer1wa/7Xixt7nGaY6VeLVgkc+BWYKlFWRG5\nUFVPSyHjF028V/Wir6qek+I7m+N3wB9VtUFlIxE5CbiQFKPCcFxrYHVVfV9VPxORFUXkh8BPVXXj\nlG3rCEwTkdK53R8YLyL3A6hq1e6uIvIE5gWyAqY03hPLNVPV7CjmtSdLUnuvU3bjX4VswXwQwWc9\n8JaInMmS2sOHY2s2aYhdMhNsTeQELLWDYoPI3I4SdanoAdTcpYYBw4Jt7xDgMhHJZNuLyHVhpHQm\nNgLvgFWnqZoyk0TJVjgZGCAiAzSFq2YNOFBEvlDV2wFE5BrMDS0Nu6rqESJysqpe0fzHmybSusgA\nVR1SvlNVrwzrG2nacyjmafOZWNHr32HeIC+QwcOFbOmIG2PVMMo9BrhFQ7GXNAIqXHsHk+3ai5ba\nW+JH/h6GuWmWTJ1jwr6qiTiLSnIz8DFQujF+DzPlfjejPGtXvS7GNoaIrK85U3bm/P7uGvywm9rX\njIzyqL4GRB7JpkKs7uz9mOLaA/hIVU9OKSPawm6Qdze2LvI9EusiadolodpV2vca+fxUzDNmpljo\n/bPAQar6QLUyGpG7Cg2LoWTJzhml2Esjsv+qDXPdV3tc7tTeUsc+65VmUVgNhtRrTFIha2ilfWmp\nyxG9WLBGY3cgJYLNKgd/xXyyk6SaOqrqOWHqf5GqZk15EJWyRaBjMHPSWKxwRaeUSifmwi7EWRcp\nHwmWEGxUmIb/qupMMHOZiMzIo+TFqh6di5XbKwVQZekniFfspRJZY1i6icgFmFkiOSOr+vdpJJ91\nEblcVU8RkQeo7K+eJSo89ywqwcQwq38utPebFNh08/cK+9bFpnvRAh7SEHvqqKoLg2tYvVAp6dte\n4ZFK6URe2IU46yJPsnRFqJKb3ZiUstYqM7+tltzOYHr7BbCpRijVp6p3k1j4DAvGqUfhjZA1F8ww\nzExyGbAz5lffKqOsC0VkqchfoNrI35JH2yUZv78SK4jI2piJ69c5ZW0FPCNW6wDMrPtqmKlp1plZ\nXSp6Vf1r6XUYkZyBhTxfiGXVawliJ40CmBwW3O4m4XaoGXL55EUt6VsrYKCqjo0k80cish3QQ1WH\niVXD6pjGzBUorYucxZJ1kVR2bVU9KoyOFoWR7iaYaWpaycUuBdfT0COofDst/2ZJKH4uJH9ahk6N\nvUV2Rd9OVUeLiASz61DJXioxV+SvhgIlOV2sy4k5i9ojXrOWULc2+jCCPhMLnb8YuE3Th71HR0QG\nquqzkWRFy+UTi7T26mZknY35AW+kqj1F5OtYcNEyn8mEtuyJDW5GYbn7n8BSLDyqqr9b1m1KtK0v\nNup9noYJxFK754nIk4S0DKX/UVKUT5SGAUXlaBpzS0LmM5gXyUjMxXUucKFmDJwTkf2wAKWOmK9/\nmvxJTZpUYqxl1CN1qejD4ttWWDj4CMoKQmdZpIpFJA+QukVELsEWF+/RnCeHWFHqvlhhiJLSqXph\nUES+r6q3SSOBU2lMJGHq2wdLpfAO0DXYVdthxWRSX+CxzoXgVvk0ZbnfK3l1VCHrBVXtn7xhS46y\ndjEQy5EzDZsN/xYzd/5eVZ9PISNK5G84JxWrU/EA8Hny/SyOHnlnUcuCujTdYIs+igUP/Yz8i3kx\niRYZKxHrs0bkOOCnwEIR+RwW18RNu2AJtmipIlKK+Gyf8vjS5yuZRdLehBaoFfL+PxH5d8nGq6qf\ni2W2zEKsc6FNFg+NRohW7CWsRS3251bVezO2qZuqvgB8SqhtICLfxWYw1RLFZ12XZK49DFP2r4Tn\nx3JYDHIlt1smaM5kOf9rD0ICK0JZNaANlvo4i6xo9Vnr8YHdqP8MzMLWMZ4FTsogZ9tq9jUj43ms\nChdYFGtp/6qkKEVXi3MBszsfi2XrzJtgawPgH5jNfy42U1g/g5xrsZD+o8LjEeCajG2qVN4wU5+X\nyVidjCX7EjIOAd7H8udklVGzkpmxHvU6ol9MxFFFLKJFxgKdVTVpp79JRE7J1boIiMg+LMn3/YSq\nVvKCahZVvUREdsMCQDbCii+PyiDqKpZ2aa20ryl20JDwTVWTI/g2pIyKTRDrXCgF6pxOw5lK1TPX\nMvPWQ1hxlVJdggOxLIhpyJ1/R2oQGVvJZ11SRP4GGetgKRj2x3LlnMqSwKksRC2ZWQvqWtHL0ln9\njheR3TRFVr8akDsyNkHM+qxREJELMdPZ7WHXySKyraqenkVeUOyjguxWInK4hqjbKtoyEEsp3LlM\nka1C+gpMXzay/31sRJeFWOfCr7Dkah+LyFnYDey3KWXEqktQInf+HSJGxibI5bMeFqs7Ymt/R7Hk\nelsxQ7xIiSjV3WpJXS7GlhCR6TQcVbQCXtb0uURitKXSiKG0dqCaIW2BiKyPjUwHsqQ+60mq+kaT\nB9aQcNH0KY16xQK7JmmKxUqxCM8TseRY92OKvlTn9UVV3bdKOTtikbXH07Cu6ydYxalYgUCZkAhR\n0uGYl1R18+CK+lvMx/s3qvrNZg6tJGsMsJeGBGtiKZ0fVNUdmj5yKTlPYjeMBvl3gPmQOv/O4shY\nyZkiQHJG/opV9SopvdJz8jrOOouCjNXdlgV1PaInzqgiFuUjplIY9nfINmICeDfNBbMMWQ0ojWyy\npEi9FZsSP4tF2Z6BXUz7aYoc3Wq+zk+KyE3agmkvmiB3lHSg5FW2F3C9WtrbrAt5XYBkjYX/hn1p\niZl/Z1QwBybNLc+oapZRfS6fdY1b1Sv2LKpm1PuIPtqoImKbooyYwrEzsbSwT4XH01pl7ctaIZaw\n60LMx1wwW/1pqnpXChlTVHWz8Lo1Zq9cT1W/yNimzpjfdLkbY77yahmRJVHSv6dhps5VsEW9TVLK\n+zu2cLobduP4HBinqltkaNuvsQjNZF2Cu1T1grSygrwY+XcmqWrfYG5Zt2RuSTNLrAWx1v9i6oRa\nUe8j+pijiljEGjGhqt8QkfWwHPJ7AdeIyEfagj7PWPTvjdiIfDbwK1V9J6WMxQms1FI9zMmq5AO3\nA3eFth2PLZ7OyyEvL7GjpA/GIiIvUdWPxMLpm0r13Ciasy5BCYmbfydaioBYPuuR1/+i6YRaUdcj\n+hIxRhUR2xJtxBT86LfHaqlugZlLns46+oqBiOwc2rQ9sCFWpGOMpkg3LCILMTtlyfbZDnP3y+ST\nLyITVHWr5CiwFBiURk5sJGKUdL0hln55oEbIvxN85s/CzC0/CuaWizVbJsxckb8JOdHW/2LPompB\nXSv6xkYVaRZMatSuLVkyYhqTZcQU5CzCcpifr5adry4I5pb+WAKq44HPVbVX00fVtD3PqeoAEXkU\ny9P9FjBSVTdsqTaFdhU2SlpEHgEOUNUoOXhiIZEif4O57MTS2k9wjLhaVcsT31UrL4pOqBX1brqJ\nltUvJhqnkhNYeoDtgO+JyGnYotKTqtpSidsQkdFYROqz2LpBf7Van1lkDcBGSUnbZW9NEfoeOE+s\n6tHPMC+lVcjunheTmPWD643TsSyKMfLvxIwAj+WzHq2qV/h8LJ1QE+p9RF+Xo4qYiEgHTNlvTygs\nrarrt2B7LsO8Rr7E8tGPAZ5V1c+bPLCyrElY2bfk9Hi8qqYJdKpbEouMJffINtii3oCWblteJG7+\nnVFYmoFSiuDvA4er6m4ZZG2A+axvg60jvRZkpfLKCq67jaJxs1u2OPWu6KNl9atHRGQ8lmTrGYLn\nTb24EYbR9xDM9/1rqrpSBhlLTamzeFuEi/sKLN5gETbbOFUt13qLISLjVHXr4HVxAhYZO66lTYsx\nkLhZTCudB6nMLbXyWa+n9b9aUu+mmz9jaU0bjCoKxAlaVnA5S8BNTETkx9jsYivM6+ZG0ldzKjFL\nrPj2H8P2CVjem7TcAVyDhayDha8PB1IHFEUmZpR0vfFwWCN7gIaDrCyKMEYEeFSf9cheRXVPvY/o\no40q6hERmVhuxih5mLRgm36OKfYJmjP/v1hh6SuxvClgybZOSWvzrzQLEJEXs/iZx6DC6BJyRknX\nG2J56UssVhJZZisSMQI8YuRvNK+i5YF6H9HHHFXUDRK/on00VDVaibWg0A+NIOrhsFh9J6YoDgEe\nklANqQXOh1pESdcbMfLvAItzvMcKbozlsx6tqtfyQL2P6KONKuoJqeOK9jGJ5W3RyHmQKT9JTJaH\niMisSNz8O9EKc8TyWS/6+l859a7oD6bCqCK4Mi33FDngBuJ5W9TreSAir2L50L8M2ythuekzlcir\nJxIeRRcAU1T1jqym1FhBTgl5uX3WY3oVLQ/Uu+nmTFUdEUYVu2Cjij/S8otwsfgg+K3XbQmynMTK\nt1+v58EtwDgRSY4ub2q55kRlroj8Gcu/c1G4ibXKKGtlVR0n0qAMbeb1n0g+6zGretU9Wf+4ZcVS\nWaxg65kAAAQrSURBVP2AFVuwPbG5HgtM+QqsBBlxbNr1wgci8n0RaR0e3ydbvv26PA/UCoofhflz\n/wfLK1M3Ye85ORjLErm7qn6EVb3KlH+H+izM8bCIHCsia4tIp9KjhdtUM+rddBMtq189Eiucu15p\nxNviJ6r6Zko5hT4Pik6sIKfIbSrk+l9j1LuiXxnL6jdFVWeIZcDbTFUfa+GmRUEsy+CPgbtVdcsw\n0jlaVfds4abVDBE5RVUvT3lMoc+DopNwR00GOc3HXHirrk8QuU11ue5TK+pa0Redehzp1BoReUNV\n12vpdjjLDhG5A+iHeZgJluL5JaAbNsj5fQu0KZpX0fKAK/oWJCxwHYSd8J2wItqqque2ZLtqiYi8\nqarrtnQ7nGVHcEP9tqp+GrY7AA9is7QJqtq7BdoUzatoeaDevW6Kzn3AR5gHwVst3JZlhY8s/vdY\ni4SvOuZ80EVVPxeRikXblwExvYrqHlf0LUtXVd2jpRsRGxH5hMoKXTA7rfO/xe3A8yJSqrnwHeAO\nEWkPvNJCbYpW1Wt5wE03LYiIXAdcpapTWrotjlNLRKQfSyKkx6rq+JZsz/8aruhbEBF5Batb+Ro2\ntS1V0GrRosmO4xQLV/QtSPAzX4oie904jrPscUXvOI5TcAq7yuw4juMYrugdx3EKjit6Z7lDRBaK\nyOTE47RmPr+TiGyT2D5eRI4Mr4eIyNcT7z0RPESWOeVtcZxYuB+9szzyecrEbzsBn2JJ1VDVPyXe\nGwJMpT4C1oZQP21xCoSP6J3CICKzReQcEZkoIlNEpJeIdAOOB04No//tRWSoiPw8JJHrB9we3mtX\nJu9bIvJskHd3CN0vfc8F4ZjxIrKliDwqIv8WkeMTx/9CRF4QkZdE5Jywr5uITBOR60XkZRF5TETa\nNdcWx8mDK3pneaRdmenmkMR774eC638Efq6qs4E/AZepah9Vfar0QVUdCYzHEsn1UdXPS++JyJrA\nmcCuQd54IFmo4o0wq3gKKzZyEDAAKCn0bwE9gK2BPsBWIlIqMdgDuEZVN8FSYBzYVFscJy9uunGW\nR5oy3dwTnicABzTymWoYAPQGxobKSCsCybKPpVq/U4AOoW7sJyLypYisBnwrPEpl7jpgCv4N4LVE\net4JWFI7x6kZruidolFKkrWQfOe3AKNU9bBmvmcRDRN2LQrfK8AFqvrnBkLNlJT8/EI8/49TY9x0\n4/wv8AnQMeV7zwHbisg3AESkvYj0TPGdjwI/SNj11xGRtXK003Ey44reWR4pt9Ff2MznHwD2Ly3G\nlr13E/Cn8gVQVZ2HecEMF5GXMLNNr2obGKpf3QE8KyJTgJE0r8QrtsVx8uIpEBzHcQqOj+gdx3EK\njit6x3GcguOK3nEcp+C4onccxyk4rugdx3EKjit6x3GcguOK3nEcp+C4onccxyk4/w/QrsjwGXPf\nTQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x9037301128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "pro_license.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using the `License` object's `report` property, you can view the same information as a **Pandas DataFrame** table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Entitlement</th>\n",
       "      <th>Total</th>\n",
       "      <th>Assigned</th>\n",
       "      <th>Remaining</th>\n",
       "      <th>Users</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3DAnalystN</td>\n",
       "      <td>500</td>\n",
       "      <td>7</td>\n",
       "      <td>493</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>airportsN</td>\n",
       "      <td>500</td>\n",
       "      <td>3</td>\n",
       "      <td>497</td>\n",
       "      <td>[{'user': 'test_create_11', 'lastUsed': Non...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>aviationN</td>\n",
       "      <td>500</td>\n",
       "      <td>4</td>\n",
       "      <td>496</td>\n",
       "      <td>[{'user': 'test_create_2', 'lastUsed': 'Octobe...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>bathymetryN</td>\n",
       "      <td>500</td>\n",
       "      <td>4</td>\n",
       "      <td>496</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>businessStdN</td>\n",
       "      <td>500</td>\n",
       "      <td>11</td>\n",
       "      <td>489</td>\n",
       "      <td>[{'user': 'test_create_4', 'lastUsed': 'April 18, 2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>dataInteropN</td>\n",
       "      <td>500</td>\n",
       "      <td>6</td>\n",
       "      <td>494</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>dataReviewerN</td>\n",
       "      <td>500</td>\n",
       "      <td>4</td>\n",
       "      <td>496</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>defenseN</td>\n",
       "      <td>500</td>\n",
       "      <td>3</td>\n",
       "      <td>497</td>\n",
       "      <td>[{'user': 'test_create_11', 'lastUsed': Non...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>desktopAdvN</td>\n",
       "      <td>500</td>\n",
       "      <td>13</td>\n",
       "      <td>487</td>\n",
       "      <td>[{'user': 'test_create_4', 'lastUsed': 'April 18, 2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>desktopStdN</td>\n",
       "      <td>500</td>\n",
       "      <td>1</td>\n",
       "      <td>499</td>\n",
       "      <td>[{'user': 'test_create_2', 'lastUsed': 'Octobe...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>geostatAnalystN</td>\n",
       "      <td>500</td>\n",
       "      <td>4</td>\n",
       "      <td>496</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>imageAnalystN</td>\n",
       "      <td>500</td>\n",
       "      <td>6</td>\n",
       "      <td>494</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>indoorsN</td>\n",
       "      <td>500</td>\n",
       "      <td>1</td>\n",
       "      <td>499</td>\n",
       "      <td>[{'user': 'test_create_5', 'lastUsed': 'Marc...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>locateXTN</td>\n",
       "      <td>500</td>\n",
       "      <td>2</td>\n",
       "      <td>498</td>\n",
       "      <td>[{'user': 'pythondemo', 'lastUsed': None}, {'u...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>LocRefDesktopN</td>\n",
       "      <td>500</td>\n",
       "      <td>3</td>\n",
       "      <td>497</td>\n",
       "      <td>[{'user': 'test_create_11', 'lastUsed': Non...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>maritimeN</td>\n",
       "      <td>500</td>\n",
       "      <td>3</td>\n",
       "      <td>497</td>\n",
       "      <td>[{'user': 'test_create_11', 'lastUsed': Non...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>networkAnalystN</td>\n",
       "      <td>500</td>\n",
       "      <td>5</td>\n",
       "      <td>495</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>productionMapN</td>\n",
       "      <td>500</td>\n",
       "      <td>3</td>\n",
       "      <td>497</td>\n",
       "      <td>[{'user': 'test_create_11', 'lastUsed': Non...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>publisherN</td>\n",
       "      <td>500</td>\n",
       "      <td>3</td>\n",
       "      <td>497</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>smpAsiaPacificN</td>\n",
       "      <td>500</td>\n",
       "      <td>6</td>\n",
       "      <td>494</td>\n",
       "      <td>[{'user': 'test_create_4', 'lastUsed': 'April 18, 2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>smpEuropeN</td>\n",
       "      <td>500</td>\n",
       "      <td>6</td>\n",
       "      <td>494</td>\n",
       "      <td>[{'user': 'test_create_4', 'lastUsed': 'April 18, 2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>smpLAmericaN</td>\n",
       "      <td>500</td>\n",
       "      <td>3</td>\n",
       "      <td>497</td>\n",
       "      <td>[{'user': 'test_create_4', 'lastUsed': 'April 18, 2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>smpMidEAfricaN</td>\n",
       "      <td>500</td>\n",
       "      <td>6</td>\n",
       "      <td>494</td>\n",
       "      <td>[{'user': 'test_create_4', 'lastUsed': 'April 18, 2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>smpNAmericaN</td>\n",
       "      <td>500</td>\n",
       "      <td>7</td>\n",
       "      <td>493</td>\n",
       "      <td>[{'user': 'test_create_4', 'lastUsed': 'April 18, 2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>spatialAnalystN</td>\n",
       "      <td>500</td>\n",
       "      <td>6</td>\n",
       "      <td>494</td>\n",
       "      <td>[{'user': 'test_create_10', 'lastUsed': 'July ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>workflowMgrN</td>\n",
       "      <td>500</td>\n",
       "      <td>4</td>\n",
       "      <td>496</td>\n",
       "      <td>[{'user': 'test_create_2', 'lastUse...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Entitlement  Total  Assigned  Remaining  \\\n",
       "0        3DAnalystN    500         7        493   \n",
       "1         airportsN    500         3        497   \n",
       "2         aviationN    500         4        496   \n",
       "3       bathymetryN    500         4        496   \n",
       "4      businessStdN    500        11        489   \n",
       "5      dataInteropN    500         6        494   \n",
       "6     dataReviewerN    500         4        496   \n",
       "7          defenseN    500         3        497   \n",
       "8       desktopAdvN    500        13        487   \n",
       "9       desktopStdN    500         1        499   \n",
       "10  geostatAnalystN    500         4        496   \n",
       "11    imageAnalystN    500         6        494   \n",
       "12         indoorsN    500         1        499   \n",
       "13        locateXTN    500         2        498   \n",
       "14   LocRefDesktopN    500         3        497   \n",
       "15        maritimeN    500         3        497   \n",
       "16  networkAnalystN    500         5        495   \n",
       "17   productionMapN    500         3        497   \n",
       "18       publisherN    500         3        497   \n",
       "19  smpAsiaPacificN    500         6        494   \n",
       "20       smpEuropeN    500         6        494   \n",
       "21     smpLAmericaN    500         3        497   \n",
       "22   smpMidEAfricaN    500         6        494   \n",
       "23     smpNAmericaN    500         7        493   \n",
       "24  spatialAnalystN    500         6        494   \n",
       "25     workflowMgrN    500         4        496   \n",
       "\n",
       "                                                Users  \n",
       "0   [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "1   [{'user': 'test_create_11', 'lastUsed': Non...  \n",
       "2   [{'user': 'test_create_2', 'lastUsed': 'Octobe...  \n",
       "3   [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "4   [{'user': 'test_create_4', 'lastUsed': 'April 18, 2...  \n",
       "5   [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "6   [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "7   [{'user': 'test_create_11', 'lastUsed': Non...  \n",
       "8   [{'user': 'test_create_4', 'lastUsed': 'April 18, 2...  \n",
       "9   [{'user': 'test_create_2', 'lastUsed': 'Octobe...  \n",
       "10  [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "11  [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "12  [{'user': 'test_create_5', 'lastUsed': 'Marc...  \n",
       "13  [{'user': 'pythondemo', 'lastUsed': None}, {'u...  \n",
       "14  [{'user': 'test_create_11', 'lastUsed': Non...  \n",
       "15  [{'user': 'test_create_11', 'lastUsed': Non...  \n",
       "16  [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "17  [{'user': 'test_create_11', 'lastUsed': Non...  \n",
       "18  [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "19  [{'user': 'test_create_4', 'lastUsed': 'April 18, 2...  \n",
       "20  [{'user': 'test_create_4', 'lastUsed': 'April 18, 2...  \n",
       "21  [{'user': 'test_create_4', 'lastUsed': 'April 18, 2...  \n",
       "22  [{'user': 'test_create_4', 'lastUsed': 'April 18, 2...  \n",
       "23  [{'user': 'test_create_4', 'lastUsed': 'April 18, 2...  \n",
       "24  [{'user': 'test_create_10', 'lastUsed': 'July ...  \n",
       "25  [{'user': 'test_create_2', 'lastUse...  "
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.report"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Querying App Extensions Assigned to a User\n",
    "\n",
    "You can retrieve the app extensions assigned to a particular user using the `License` object's `user_entitlement()` method:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'username': 'test_create_f0d9',\n",
       " 'lastLogin': -1,\n",
       " 'disconnected': False,\n",
       " 'entitlements': ['businessStdN', 'desktopStdN']}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.user_entitlement('test_create_f0d9')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Assigning Licenses and Entitlements to a named user account\n",
    "\n",
    "You can assign licenses and entitlements to a named user account using the **assign()** method, which is available on the specific `License` object (e.g., the **pro_license** variable)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can assign a **single entitlement** in the following way:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.assign(username='test_create_f0d9', entitlements=['airportsN'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can verify if the entitlement is correctly set using the **user_entitlement()** of `License` object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'username': 'test_create_f0d9',\n",
       " 'lastLogin': -1,\n",
       " 'disconnected': False,\n",
       " 'entitlements': ['airportsN', 'desktopStdN']}"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.user_entitlement('test_create_f0d9')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can assign **multiple entitlements** in the following way:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.assign(username='test_create_f0d9', entitlements=['3DAnalystN', 'businessStdN'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can verify if the entitlements are correctly set using the **user_entitlement()** of `License` object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'username': 'test_create_f0d9',\n",
       " 'lastLogin': -1,\n",
       " 'disconnected': False,\n",
       " 'entitlements': ['3DAnalystN', 'businessStdN', 'desktopStdN']}"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.user_entitlement('test_create_f0d9')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Revoking licenses from a named used account\n",
    "To revoke an app's license from a user, call the `revoke()` method from the corresponding `License` object."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can revoke an **individual entitlement** by passing in the specific entitlement:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.revoke(username=\"test_create_f0d9\", entitlements=['3DAnalystN'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can verify that `3DAnalystN` entitlement have been revoked"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'username': 'test_create_f0d9',\n",
       " 'lastLogin': -1,\n",
       " 'disconnected': False,\n",
       " 'entitlements': ['businessStdN', 'desktopStdN']}"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.user_entitlement('test_create_f0d9')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can revoke all entitlements for this app by passing in `*` as string value to `entitlements` parameter "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.revoke(username='test_create_f0d9', entitlements='*')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can verify that all entitlements have been revoked"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{}"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pro_license.user_entitlement('test_create_f0d9')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Managing ArcGIS Online credits\n",
    "If your GIS is an organization on ArcGIS Online, you would notice a `credits` property exposed on your `admin` object. You can use this to view, allocate credits to your users, set a default limit etc. To learn more about credits refer [here](http://doc.arcgis.com/en/arcgis-online/reference/credits.htm).\n",
    "\n",
    "<blockquote><b>Note:</b> ArcGIS Enterprises do not support the concept of credits. Hence if your GIS is an instance of Enterprise, you would not see the <b>credits</b> property. </blockquote>\n",
    "\n",
    "### Viewing available credits:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3171304"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.credits.credits"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Managing credits through credit budgeting\n",
    "The credit budgeting feature of ArcGIS Online allows administrators to view, limit, and allocate credits to their users. Learn more about [credit budgeting here](http://doc.arcgis.com/en/arcgis-online/administer/configure-credits.htm).\n",
    "\n",
    "You can use the `enable()` method to turn on credit budgeting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.credits.enable()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can use the `is_enabled` property to verify if credit budgeting is turned on."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.credits.is_enabled"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once you turn on credit budgeting, you can set a **default limit** for the number of credits **per user**. In addition, you can set **custom limits** for individual users. The default limit applies when you create a new user **unless a custom limit is specified**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "601"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.credits.default_limit"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Allocating credits to a user\n",
    "You can use the `allocate()` and `deallocate()` methods to allocate custom number of credits or remove credits from a named user."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#assign one tenth of the available credits to test_create_f0d9 account\n",
    "api_acc_credits = gis.admin.credits.credits / 10\n",
    "gis.admin.credits.allocate(username='test_create_f0d9', credits=api_acc_credits)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Checking credits assigned and available to a user"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"9item_container\" style=\"height: auto; overflow: hidden; border: 1px solid #cfcfcf; border-radius: 2px; background: #f6fafa; line-height: 1.21429em; padding: 10px;\">\n",
       "                    <div class=\"item_left\" style=\"width: 210px; float: left;\">\n",
       "                       <a href='https://dummy.arcgis.com//home/user.html?user=test_create_f0d9' target='_blank'>\n",
       "                        <img src='https://dummy.arcgis.com//home/js/arcgisonline/css/images/no-user-thumb.jpg' class=\"itemThumbnail\">\n",
       "                       </a>\n",
       "                    </div>\n",
       "\n",
       "                    <div class=\"item_right\" style=\"float: none; width: auto; overflow: hidden;\">\n",
       "                        <a href='https://dummy.arcgis.com//home/user.html?user=test_create_f0d9' target='_blank'><b>Demo Account</b>\n",
       "                        </a>\n",
       "                        <br/><br/><b>Bio</b>: \n",
       "                        <br/><b>First Name</b>: Demo\n",
       "                        <br/><b>Last Name</b>: Account\n",
       "                        <br/><b>Username</b>: test_create_f0d9\n",
       "                        <br/><b>Joined</b>: December 23, 2016\n",
       "\n",
       "                    </div>\n",
       "                </div>\n",
       "                "
      ],
      "text/plain": [
       "<User username:test_create_f0d9>"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "api_acc = gis.users.get('test_create_f0d9')\n",
    "api_acc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When you turn on credit budgeting (using the `enable()` method), the `User` object gets additional properties to indicate the `assignedCredits` and remaining `avialableCredits`. Thus, you can verify as shown below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8039.734"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "api_acc.assignedCredits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8039.734"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "api_acc.availableCredits"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As the user continues to use the credits, the `availableCredits` property can be used to check how much is available for that account. If a user does not have a limit set, then the total available credits in the org become their available credits. The account shown below as not custom limit, hence, it inherits the org's total limit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "80397.34"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_user_9 = gis.users.get('test_create_9')\n",
    "test_user_9.availableCredits"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Disable credit budgeting\n",
    "Yon disable this feature by calling the `disable()` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.credits.disable()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Attaching and removing ArcGIS Servers from your GIS\n",
    "If your GIS is an instance of ArcGIS Enterprise, you can build it up by federating (attaching) ArcGIS Server sites to your Enterprise. During this step, you can assign a role to your server, such as Hosting or Federated. You can also assign a function such as 'Raster Analysis,' 'GeoAnalytics,' and more to designate its purpose. Federating and maintaining your server bank is an important administrative task. To learn more about this topic and the implications of federation, refer to the official documentation [here](http://server.arcgis.com/en/server/latest/administer/windows/federate-an-arcgis-server-site-with-your-portal.htm).\n",
    "\n",
    "<blockquote><b>Note:</b> Federation only applies to <b>ArcGIS Enterprise organizations</b>. If your GIS is an organization on ArcGIS Online, you cannot perform these tasks.</blockquote>\n",
    "\n",
    "The `Federation` class of the `admin` module allows GIS administrators to script and automate tasks such as listing the servers in a GIS, identifying their role and function, federating new servers, unfederating servers under maintenance, and validating the server list."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Get the list of servers federated to the GIS:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'servers': [{'adminUrl': 'https://Dev005223.esri.com:6443/arcgis',\n",
       "   'id': 'COgNhKlPsIjGrCLV',\n",
       "   'isHosted': True,\n",
       "   'name': 'Dev005223.esri.com:6443',\n",
       "   'serverFunction': '',\n",
       "   'serverRole': 'HOSTING_SERVER',\n",
       "   'url': 'https://Dev005223.esri.com/server',\n",
       "   'webgisServerTrustKey': ''},\n",
       "  {'adminUrl': 'https://dev005331.esri.com:6443/arcgis',\n",
       "   'id': 'GFyaVzJXiogsxKxH',\n",
       "   'isHosted': False,\n",
       "   'name': 'dev005331.esri.com:6443',\n",
       "   'serverFunction': 'RasterAnalytics',\n",
       "   'serverRole': 'FEDERATED_SERVER',\n",
       "   'url': 'https://dev005331.esri.com/server',\n",
       "   'webgisServerTrustKey': ''}]}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.federation.servers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are 2 servers federated to this GIS, the first is a `HOSTING_SERVER` and the second a `FEDERATED_SERVER`. The `serverFunction` of the second server is set to `RasterAnalytics`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Validating your servers\n",
    "To validate all the servers attached to your GIS, call the `validate_all()` method. To validate a particular server, call `validate()` and pass the server's **name or ID**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'serversStatus': [{'messages': [\"ArcGIS Server administration URL 'https://Dev005223.esri.com:6443/arcgis' is accessible.\",\n",
       "    'Validating hosting server.',\n",
       "    \"ArcGIS Server 'https://Dev005223.esri.com:6443/arcgis' version matches with Portal for ArcGIS.\",\n",
       "    \"Verified that server has a registered managed database '/enterpriseDatabases/AGSDataStore_ds_7jq2u67r'.\",\n",
       "    \"The server managed database '/enterpriseDatabases/AGSDataStore_ds_7jq2u67r' validated successfully.\",\n",
       "    'Validated that the ArcGIS Server site is not in read-only mode.',\n",
       "    'Validated that the publishing tools service of ArcGIS Server site is started.'],\n",
       "   'serverId': 'COgNhKlPsIjGrCLV',\n",
       "   'status': 'success'},\n",
       "  {'messages': [\"ArcGIS Server services URL 'https://dev005331.esri.com/server' cannot be validated against 'https://dev005331.esri.com/server/rest/info'. If the service URL is a proxy URL verify it is accessible to clients.\",\n",
       "    'Error: java.net.UnknownHostException: dev005331.esri.com. '],\n",
       "   'serverId': 'GFyaVzJXiogsxKxH',\n",
       "   'status': 'failure'}],\n",
       " 'status': 'failure'}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.federation.validate_all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The second server reports a failure as the Enterprise is unable to reach or ping it. This server requires maintenance."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Unfederating a server\n",
    "You remove a server from the GIS by calling the `unfederate()` method and passing the `serverId`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'GFyaVzJXiogsxKxH'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.federation.servers['servers'][1]['id']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.federation.unfederate('GFyaVzJXiogsxKxH')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Querying Portal logs\n",
    "\n",
    "Portal for ArcGIS records events that occur, as well as any associated errors, in its logs. Logs are an important tool for monitoring and troubleshooting problems with your portal. Information in the logs will help you identify errors and provide context on how to address problems. The logs also comprise a history of the events that occur over time.\n",
    "\n",
    "For example, the following events are recorded in the logs:\n",
    "\n",
    " - Installation and upgrade events, such as authorizing the software and creating the portal website\n",
    " - Publishing of services and items, such as hosted services, web maps, and data items\n",
    " - Content management events, such as sharing items, changing item ownership, and adding, updating, moving, and deleting items\n",
    " - Security events, such as users logging in to the portal, creating, deleting, and disabling users, creating and changing user roles, updating HTTP and HTTPS settings, import and export of security certificates, and updating the portal's identity store\n",
    " - Organization management events, such as adding and configuring groups, adding or removing users from a group, configuration of the gallery, basemaps, utility services, and federated servers, and configuring log settings and deleting logs\n",
    " - General events, such as updating the portal's search index and restarting the portal\n",
    "\n",
    "Understanding log messages is important to maintain your GIS. Refer [here](http://server.arcgis.com/en/portal/latest/administer/windows/about-portal-logs.htm) to learn more about logging in general and [here](http://server.arcgis.com/en/portal/latest/administer/windows/work-with-portal-logs.htm#ESRI_SECTION2_F96B4BDF7FBD4EFC865E316C1DFB460C) to understand what gets logged and what the messages mean.\n",
    "\n",
    "Using the `Logs` class of the `admin` module, administrators can query and work with Portal log messages. You can query the logging level and other settings from the `settings` property:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'logDir': 'C:\\\\arcgisportal\\\\logs\\\\',\n",
       " 'logLevel': 'WARNING',\n",
       " 'maxErrorReportsCount': 10,\n",
       " 'maxLogFileAge': 90,\n",
       " 'usageMeteringEnabled': False}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.logs.settings"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Filtering and querying Portal logs\n",
    "Using the `query()` method, you can filter and search for Portal logs. Refer to the [query API ref doc](http://esri.github.io/arcgis-python-api/apidoc/html/arcgis.gis.admin.html#arcgis.gis.admin.Logs.query) for all the arguments supported. In the example below, logs for the previous 10 days is searched."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2017, 8, 1, 15, 5, 32, 941945)"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import datetime\n",
    "import pandas as pd\n",
    "now = datetime.datetime.now()\n",
    "start_time = now - datetime.timedelta(days=10)\n",
    "start_time"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can pass a Python `Datetime` object to the time arguments."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'code': 207051,\n",
       " 'elapsed': '',\n",
       " 'machine': 'DEV005223.ESRI.COM',\n",
       " 'message': \"Validation failed for federated server 'https://dev005331.esri.com:6443/arcgis'.\",\n",
       " 'methodName': '',\n",
       " 'process': '1956',\n",
       " 'source': 'Portal Admin',\n",
       " 'thread': '14',\n",
       " 'time': 1502486731894,\n",
       " 'type': 'WARNING',\n",
       " 'user': ''}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recent_logs = gis.admin.logs.query(start_time = start_time)\n",
    "\n",
    "#print a message as a sample\n",
    "recent_logs['logMessages'][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can construct a Pandas `DataFrame` from the query result and visualize the logs as a table:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>endTime</th>\n",
       "      <th>hasMore</th>\n",
       "      <th>logMessages</th>\n",
       "      <th>startTime</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1501718081748</td>\n",
       "      <td>False</td>\n",
       "      <td>{'elapsed': '', 'message': 'Validation failed ...</td>\n",
       "      <td>1502486731894</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1501718081748</td>\n",
       "      <td>False</td>\n",
       "      <td>{'elapsed': '', 'message': ' Failed to update ...</td>\n",
       "      <td>1502486731894</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1501718081748</td>\n",
       "      <td>False</td>\n",
       "      <td>{'elapsed': '', 'message': 'Validation failed ...</td>\n",
       "      <td>1502486731894</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1501718081748</td>\n",
       "      <td>False</td>\n",
       "      <td>{'elapsed': '', 'message': 'Validation failed ...</td>\n",
       "      <td>1502486731894</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1501718081748</td>\n",
       "      <td>False</td>\n",
       "      <td>{'elapsed': '', 'message': ' Failed to accept ...</td>\n",
       "      <td>1502486731894</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         endTime hasMore                                        logMessages  \\\n",
       "0  1501718081748   False  {'elapsed': '', 'message': 'Validation failed ...   \n",
       "1  1501718081748   False  {'elapsed': '', 'message': ' Failed to update ...   \n",
       "2  1501718081748   False  {'elapsed': '', 'message': 'Validation failed ...   \n",
       "3  1501718081748   False  {'elapsed': '', 'message': 'Validation failed ...   \n",
       "4  1501718081748   False  {'elapsed': '', 'message': ' Failed to accept ...   \n",
       "\n",
       "       startTime  \n",
       "0  1502486731894  \n",
       "1  1502486731894  \n",
       "2  1502486731894  \n",
       "3  1502486731894  \n",
       "4  1502486731894  "
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_df = pd.DataFrame.from_records(recent_logs)\n",
    "log_df.head(5) #display the first 5 records"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once you have the logs as a `DataFrame`, you can save it to disk in any format you choose. For instance, you can save it to a `csv` file for archival."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "outputs": [],
   "source": [
    "log_df.to_csv('./portal_logs_last_10_days.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Clearing logs\n",
    "You can remove old logs and free up space on your Portal by calling the `clean()` method. Note, this action is not reversible."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.logs.clean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Managing GIS security\n",
    "One of the important tasks you carry out as an administrator is managing the security settings of your GIS. With the `admin` module, you can accomplish tasks such as setting the password policy, managing security certificates etc."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Working with password policies\n",
    "#### Inspecting password policy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can use the `PasswordPolicy` class in the `admin` module to inspect and update the policy for your GIS. This is applicable if you GIS uses a built-in identity store."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "  \"passwordPolicy\": {\n",
       "    \"created\": -1,\n",
       "    \"modified\": -1,\n",
       "    \"type\": \"default\",\n",
       "    \"minLetter\": 1,\n",
       "    \"minLength\": 8,\n",
       "    \"minDigit\": 1\n",
       "  }\n",
       "}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "existing_policy = gis.admin.password_policy.policy\n",
    "existing_policy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Updating password policy\n",
    "You can update this policy to any desired standard. In the example below, the following additional criteria is added.\n",
    "\n",
    " - Contains at least one letter (A-Z, a-z)\n",
    " - Contains at least one upper case letter (A-Z)\n",
    " - Contains at least one lower case letter (a-z)\n",
    " - Contains at least one number (0-9)\n",
    " - Contains at least one special (non-alphanumeric) character\n",
    " - Password will expire after `90` days\n",
    " - Members may not reuse their last `5` passwords"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "outputs": [],
   "source": [
    "from copy import deepcopy\n",
    "new_policy = deepcopy(existing_policy)\n",
    "new_policy['passwordPolicy']['minLength'] = 10\n",
    "new_policy['passwordPolicy']['minUpper'] = 1\n",
    "new_policy['passwordPolicy']['minLower'] = 1\n",
    "new_policy['passwordPolicy']['minDigit'] = 1\n",
    "new_policy['passwordPolicy']['minOther'] = 1\n",
    "new_policy['passwordPolicy']['expirationInDays'] = 90\n",
    "new_policy['passwordPolicy']['historySize'] = 5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To update the policy, simply set the `policy` property with the new values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "outputs": [],
   "source": [
    "gis.admin.password_policy.policy = new_policy['passwordPolicy']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Query the GIS to get the updated policy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "  \"passwordPolicy\": {\n",
       "    \"minUpper\": 1,\n",
       "    \"expirationInDays\": 90,\n",
       "    \"modified\": -1,\n",
       "    \"historySize\": 5,\n",
       "    \"type\": \"custom\",\n",
       "    \"minLetter\": 2,\n",
       "    \"created\": 1502493886765,\n",
       "    \"minOther\": 1,\n",
       "    \"minLength\": 10,\n",
       "    \"minLower\": 1,\n",
       "    \"minDigit\": 1\n",
       "  }\n",
       "}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.password_policy.policy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Resetting password policy\n",
    "You can reset the policy to the default by calling the `reset()` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.password_policy.reset()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Working with security configurations\n",
    "The `config` property of the `Security` class gives you a snapshot of your security configuration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'defaultLevelForUser': '2',\n",
       " 'defaultRoleForUser': 'account_user',\n",
       " 'disableServicesDirectory': False,\n",
       " 'enableAutomaticAccountCreation': False,\n",
       " 'groupStoreConfig': {'properties': {'isPasswordEncrypted': 'true'},\n",
       "  'type': 'BUILTIN'},\n",
       " 'userStoreConfig': {'properties': {'isPasswordEncrypted': 'true'},\n",
       "  'type': 'BUILTIN'},\n",
       " 'webgisServerTrustKey': '7odWDm93E+Aux2he/7YOuq1h4wURE4DfrEWOOxazmaE='}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.security.config"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### SSL certificates\n",
    "The `SSLCertificates` class provides you with a set of methods to search for certificates, import new certificates and update existing ones. The `SSLCertificate` object that you get when you call the `get()` or `list()` methods on this class allows you to inspect, update or export individual certificates. To learn about all the tasks that can be accomplished, refer to the [API REF doc](http://esri.github.io/arcgis-python-api/apidoc/html/arcgis.gis.admin.html#sslcertificates)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<SSLCertificate at https://dev005223.esri.com/portal/portaladmin/security/sslCertificates/portal>,\n",
       " <SSLCertificate at https://dev005223.esri.com/portal/portaladmin/security/sslCertificates/samlcert>,\n",
       " <SSLCertificate at https://dev005223.esri.com/portal/portaladmin/security/sslCertificates/dev005219>]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.security.ssl.list()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can download or export the certificate to disk:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'./portal.cer'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "portal_cert = gis.admin.security.ssl.list()[0]\n",
    "portal_cert.export(out_path = './')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Enterprise identity store\n",
    "If your GIS uses an enterprise identity store instead of the built-in, you can use the `EnterpriseUsers` class and `EnterpriseGroups` class to search for users and user groups in the enterprise user database."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "  \"totalUsers\": 61\n",
       "}"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.security.enterpriseusers.properties"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "  \"totalGroups\": 0\n",
       "}"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.security.groups.properties"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Managing Enterprise licenses and system settings\n",
    "As an administrator, you can manage the licenses of the Enterprise and all the apps licensed through your Enterprise using the `system.licenses` class of the `admin` sub module. This functionality is different from [managing named user licenses and entitlements](#Managing-named-user-licenses-and-entitlements) mentioned in the beginning of this guide. This section shows you how to import and remove entitlements for different apps, the number of named user accounts that you are licensed to create and the number remaining etc.\n",
    "\n",
    "### Inspecting licenses for Portal for ArcGIS\n",
    "Calling `system.licenses.properties` will return a dictionary containing information about your license for using Portal for ArcGIS application. The dictionary below reveals the license is current, `12` is the number of named user accounts created so far and the `75` is the max licensed. The `features` dictionary reveals the details on number of level 1 and 2 users that can be created."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "  \"isValid\": true,\n",
       "  \"currentRegisteredMembers\": 12,\n",
       "  \"maximumRegisteredMembers\": 75,\n",
       "  \"expiration\": 1508223600000,\n",
       "  \"features\": [\n",
       "    {\n",
       "      \"level\": \"1\",\n",
       "      \"name\": \"esriPortalLvl1\",\n",
       "      \"displayName\": \"Portal for ArcGIS\",\n",
       "      \"isValid\": true,\n",
       "      \"maximumRegisteredMembers\": 25,\n",
       "      \"version\": \"10.5\",\n",
       "      \"expiration\": 1508223600000,\n",
       "      \"currentRegisteredMembers\": 0\n",
       "    },\n",
       "    {\n",
       "      \"level\": \"2\",\n",
       "      \"name\": \"esriPortalLvl2\",\n",
       "      \"displayName\": \"Portal for ArcGIS\",\n",
       "      \"isValid\": true,\n",
       "      \"maximumRegisteredMembers\": 50,\n",
       "      \"version\": \"10.5\",\n",
       "      \"expiration\": 1508223600000,\n",
       "      \"currentRegisteredMembers\": 12\n",
       "    }\n",
       "  ]\n",
       "}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.system.licenses.properties"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using Python's `datetime` module, you can conver the date to human readable form:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2017, 10, 17, 0, 0)"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from datetime import datetime\n",
    "datetime.fromtimestamp(round(gis.admin.system.licenses.properties.expiration/1000))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Releasing ArcGIS Pro licenses checked out for offline use\n",
    "If a user checks out an ArcGIS Pro license for offline or disconnected use, and is unable to check it back in, you can release the license for the specified account by calling `release_license()` method. Learn more about [offline licenses in ArcGIS Pro](http://pro.arcgis.com/en/pro-app/get-started/named-user-licenses.htm#ESRI_SECTION1_3379AFCFCE8D44EE8395A91E1A484594)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'status': 'success'}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.system.licenses.release_license('username')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Inspecting the machines powering your Portal for ArcGIS\n",
    "You can query the machines powering your Portal for ArcGIS application using the `Machines` class at `admin.machines`. You can inspect machine status, and unregister those under repair."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<Machine at https://dev005223.esri.com/portal/portaladmin/machines>]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.machines.list()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "  \"role\": \"\",\n",
       "  \"adminURL\": \"https://dev005223.esri.com:7443/arcgis\",\n",
       "  \"machineName\": \"DEV005223.ESRI.COM\"\n",
       "}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mac1 = gis.admin.machines.list()[0]\n",
    "mac1.properties"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Query the status of a machine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mac1.status()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Inspecting system directories\n",
    "You can inspect the physical location of various system directories used by the Portal for ArcGIS application:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "  \"name\": \"content\",\n",
       "  \"physicalPath\": \"{\\\"type\\\":\\\"fileStore\\\",\\\"provider\\\":\\\"FileSystem\\\",\\\"connectionString\\\":\\\"txfL1Ma_fryXmqsmyNt8Zfm4UEuNL79E-qaf8WbGB-8.\\\",\\\"isConnectionStringEncrypted\\\":true}\",\n",
       "  \"directoryType\": \"CONTENT\",\n",
       "  \"description\": \"The content directory.\"\n",
       "}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "portal_dir_list = gis.admin.system.directories\n",
    "portal_dir_list[0].properties"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "content | {\"type\":\"fileStore\",\"provider\":\"FileSystem\",\"connectionString\":\"txfL1Ma_fryXmqsmyNt8Zfm4UEuNL79E-qaf8WbGB-8.\",\"isConnectionStringEncrypted\":true}\n",
      "index | C:\\arcgisportal\\index\n",
      "db | C:\\arcgisportal\\db\n",
      "temp | C:\\arcgisportal\\temp\n"
     ]
    }
   ],
   "source": [
    "for portal_dir in portal_dir_list:\n",
    "    print(portal_dir.properties.name + \" | \" + portal_dir.properties.physicalPath)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Inspecting web adaptors\n",
    "You can query the web adaptors serving the Portal for ArcGIS application using the `system.web_adaptors.list()` method. This returns you a list of `WebAdaptor` objects. You can use this object to query the properties such as IP address, version and also unregister the adaptor for maintenance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<WebAdaptor at https://dev005223.esri.com/portal/portaladmin/system/webadaptors/2f3a93d7-f50b-4ce6-8244-335fbfe1dfba>]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.system.web_adaptors.list()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "  \"webAdaptorURL\": \"https://dev005223.esri.com/portal\",\n",
       "  \"reconnectServerOnFailureInterval\": 1,\n",
       "  \"id\": \"2f3a93d7-f50b-4ce6-8244-335fbfe1dfba\",\n",
       "  \"refreshServerListInterval\": 1,\n",
       "  \"httpsPort\": 443,\n",
       "  \"machineName\": \"dev005223.esri.com\",\n",
       "  \"description\": \"\",\n",
       "  \"machineIP\": \"10.44.8.245\",\n",
       "  \"httpPort\": 80\n",
       "}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wa = gis.admin.system.web_adaptors.list()[0]\n",
    "wa.properties"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'https://dev005223.esri.com/portal/portaladmin/system/webadaptors/2f3a93d7-f50b-4ce6-8244-335fbfe1dfba'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wa.url"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Inspecting other system properties\n",
    "**Database**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'adminAccount': 'admin',\n",
       " 'name': 'gwdb',\n",
       " 'version': 'psql (PostgreSQL) 9.3.12'}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.system.database"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Index status**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'indexes': [{'databaseCount': 54, 'indexCount': 54, 'name': 'users'},\n",
       "  {'databaseCount': 330, 'indexCount': 330, 'name': 'groups'},\n",
       "  {'databaseCount': 7513, 'indexCount': 7513, 'name': 'search'}]}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.system.index_status"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Supported languages**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'languages': {'esri_ar': True,\n",
       "  'esri_bs': True,\n",
       "  'esri_cs': True,\n",
       "  'esri_da': True,\n",
       "  'esri_de': True,\n",
       "  'esri_el': True,\n",
       "  'esri_en': True,\n",
       "  'esri_es': True,\n",
       "  'esri_et': True,\n",
       "  'esri_fi': True,\n",
       "  'esri_fr': True,\n",
       "  'esri_he': True,\n",
       "  'esri_hi': True,\n",
       "  'esri_hk': True,\n",
       "  'esri_hr': True,\n",
       "  'esri_id': True,\n",
       "  'esri_it': True,\n",
       "  'esri_ja': True,\n",
       "  'esri_ko': True,\n",
       "  'esri_lt': True,\n",
       "  'esri_lv': True,\n",
       "  'esri_nb': True,\n",
       "  'esri_nl': True,\n",
       "  'esri_pl': True,\n",
       "  'esri_po': True,\n",
       "  'esri_pt': True,\n",
       "  'esri_ro': True,\n",
       "  'esri_ru': True,\n",
       "  'esri_sr': True,\n",
       "  'esri_sv': True,\n",
       "  'esri_th': True,\n",
       "  'esri_tr': True,\n",
       "  'esri_tw': True,\n",
       "  'esri_vi': True,\n",
       "  'esri_zh': True}}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gis.admin.system.languages"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
